home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 3 / Amiga Format CD03 (1996-07-04)(Future Publishing)(GB)(Track 1 of 6)[!][issue 1996-08].iso / comms / netsoftware / nethandler.lha / NetHandler / handler / device.c next >
C/C++ Source or Header  |  1989-09-16  |  5KB  |  176 lines

  1. /* Device.c - Device support routines */
  2.  
  3. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  4. /* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery.  All Rights  */
  5. /* |. o.| || Reserved.  This program may not be distributed without the    */
  6. /* | .  | || permission of the authors:                            BBS:    */
  7. /* | o  | ||   John Toebes     Doug Walker    Dave Baker                   */
  8. /* |  . |//                                                                */
  9. /* ======                                                                  */
  10. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  11.  
  12. #include "handler.h"
  13.  
  14. #define MYNAME "\7NETWORK"
  15.  
  16. typedef struct FileSysStartupMsg *FSSM;
  17.  
  18. int GetDevice (global, myfssmsg)
  19. GLOBAL global;    
  20. FSSM myfssmsg;
  21. {
  22. FSSM  fssmsg;
  23. int   devnum;
  24. char  *defaultdev = "serial.device";
  25.  
  26. BUGP("GetDevice entry")
  27.  
  28.    BUG(("devname:%s\n",global->n.devname));
  29.    BUG(("Global->node = %08lx Global->node->dn_Startup = %08lx\n",
  30.          global->node, BADDR(global->node->dn_Startup)));
  31.  
  32.    /* Did they give us any information in the device list ? */
  33.    if( (fssmsg = (FSSM)BADDR(global->node->dn_Startup)) == NULL)
  34.    {
  35. BUGP("Null FSSM")
  36.       /* Initialize the device information */
  37.       global->unitnum = myfssmsg->fssm_Unit = devnum = 0;
  38.       myfssmsg->fssm_Device          = (ULONG)defaultdev;
  39.       myfssmsg->fssm_Flags           = 0;
  40.       BUG(("GetDevice-fssm_Device:%s\n", myfssmsg->fssm_Device));
  41.       BUG(("GetDevice-fssm_Unit:%ld\n",   myfssmsg->fssm_Unit)); 
  42.       BUG(("GetDevice-fssm_Flags:%lx\n", myfssmsg->fssm_Flags));
  43.    }
  44.    else
  45.    {
  46. BUGP("Good FSSM")
  47.       /* They gave us all the device information in the mountlist */
  48.       if(fssmsg->fssm_Device != NULL)
  49.          myfssmsg->fssm_Device  = (ULONG)BADDR(fssmsg->fssm_Device);
  50.       else
  51.          myfssmsg->fssm_Device = (ULONG)defaultdev;
  52.       global->unitnum        =
  53.       myfssmsg->fssm_Unit    = fssmsg->fssm_Unit;
  54.       myfssmsg->fssm_Flags   = (ULONG)BADDR(fssmsg->fssm_Flags);
  55.   
  56.       BUG(("fssm:%lx\n", fssmsg));
  57.       BUG(("fssm_Device:%s\n",    fssmsg->fssm_Device));
  58.       BUG(("fssm_Unit:%ld\n",      fssmsg->fssm_Unit)); 
  59.       BUG(("fssm_Flags:%lx\n",    fssmsg->fssm_Flags));
  60.    }
  61.  
  62. BUGP("GetDevice exit")
  63.    return(-1);
  64. }
  65.  
  66.  
  67.  
  68. int InitDevice(global)
  69. GLOBAL global;
  70. {
  71.    struct FileSysStartupMsg myfssmsg;
  72.    int rc;
  73.  
  74.    BUGP("InitDevice: Enter")
  75.    BUG(("InitDevice: Enter\n"));
  76.  
  77.    if (GetDevice(global,&myfssmsg) == NULL)
  78.    {
  79.       BUG(("GetDevice Failed \n"));
  80.       return(0);
  81.    }
  82.  
  83.    if(!(global->n.devport=CreatePort(NULL,0)))
  84.    {
  85.       BUG(("ERROR: Can't CreatePort\n"));
  86.       return(0);
  87.    }
  88.  
  89.    BUG(("fssm_Device:%s\n", myfssmsg.fssm_Device));
  90.    BUG(("fssm_Unit:%ld\n",   myfssmsg.fssm_Unit)); 
  91.    BUG(("fssm_Flags:%lx\n", myfssmsg.fssm_Flags));
  92.  
  93.    BUGP("Init NetNode")
  94.  
  95.    /* Initialize NetNode struct for ourselves - at root of netnodes */
  96.    global->netchain.next = NULL;
  97.    global->netchain.status = NODE_UP;
  98.    MBSTR(MYNAME, global->netchain.name);
  99.    global->netchain.id = 0;
  100.    global->netchain.ioptr = NULL;
  101.    global->netchain.RootLock.NetNode = &global->netchain;
  102.    /* A NULL RDevice indicates this is a lock on the local root */
  103.    global->netchain.RootLock.RDevice = NULL;
  104.    global->netchain.RootLock.RPtr = NULL;
  105.  
  106.    global->numnodes = global->upnodes = 1;
  107. #ifndef SMALLPACKET
  108.    MBSTR(MYNAME, global->RP.handler);
  109.    global->RP.handlerid = 0;  /* Fix this! */
  110. #endif
  111.    rc = InitRDevice(global);
  112.  
  113.    BUGP("InitDevice: Exit")
  114.  
  115.    return(rc);
  116. }
  117.  
  118. struct NetNode *AddNode(global, name, ioptr)
  119. GLOBAL global;
  120. char *name;
  121. APTR ioptr;
  122. {
  123.    struct NetNode *node;
  124.  
  125. BUGBSTR("AddNode: Adding ", name);
  126. BUG(("ioptr is %lx\n", ioptr));
  127.  
  128.    /* First see if the node's name is unique */
  129.    for(node=&global->netchain; node; node=node->next)
  130.    {
  131.       if(!stricmp(node->name, name))
  132.       {
  133.          if(node->status == NODE_UP) global->upnodes--;
  134.          break;
  135.       }
  136.    }
  137.    if(!node)
  138.    {
  139.       BUG(("AddNode: Node not in chain\n"));
  140.       /* Node is new, add it */
  141.       if(!(node=(struct NetNode *)DosAllocMem(global, 
  142.                                        (long)sizeof(struct NetNode))))
  143.       {
  144.          BUG(("AddNode: Out of memory!\n"));
  145.          return(NULL);
  146.       }
  147.       /* Chain the node into the list of network nodes */
  148.       node->next = global->netchain.next;
  149.       global->netchain.next = node;
  150.       strcpy(node->name, name);
  151.       node->devname[0] = '\0';
  152.       node->id = 0;
  153.       global->numnodes++;
  154.       /* Set up dummy lock for lock templating */
  155.       node->RootLock.NetNode = node;
  156.       node->RootLock.RDevice = (RPTR)1L; /* For now - Obtain from remote */
  157.       node->RootLock.RPtr = NULL; /* For always */
  158.    }
  159.  
  160.    node->status = (ioptr ? NODE_UP
  161.                          : (node->status == NODE_UP ? NODE_CRASHED
  162.                                                     : NODE_DEAD));
  163.    node->ioptr = ioptr;
  164.  
  165.    if(node->status == NODE_UP) global->upnodes++;
  166.  
  167.    return(node);
  168. }
  169.  
  170. int TermDevice(global)
  171. GLOBAL global;
  172. {
  173.    TermRDevice(global, 0);
  174.    return(1);
  175. }
  176.